package com.ohc.笔试;

import java.util.*;

public class 带权重的随机数 {
    public static Integer randdomPick(List<Integer> arr1, List<Integer> arr2) {
        HashMap<Integer, Integer> map1 = new HashMap<>();
        HashMap<Integer, Double> map2 = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        double sum = 0;
//        统计数值和总数
        for (int i = 0; i < arr2.size(); i++) {
            map1.put(i, arr1.get(i));
            sum += arr2.get(i);
        }
        // 计算概率
        for (int i = 0; i < arr1.size(); i++) {
            map2.put(i, (Double.valueOf(arr2.get(i)) / sum) * 10);
        }
        Set<Map.Entry<Integer, Double>> entries = map2.entrySet();
        Iterator<Map.Entry<Integer, Double>> iterator = entries.iterator();
        // 根据概率往数组添加对应数量的数字
        int n = 0;
        while (iterator.hasNext()) {
            Map.Entry<Integer, Double> node = iterator.next();
            Double value = node.getValue();
            for (int i = 0; i < value; i++) {
//                System.out.println("map1.get(n) = " + map1.get(n));
                list.add(map1.get(n));
            }
            n++;
        }
        // 随机取出一个数字根据概率
        int d = new Random().nextInt(list.size());
        return list.get(d);
    }

    public static void main(String[] args) {
        List<Integer> arr1 = new ArrayList<>();
        List<Integer> arr2 = new ArrayList<>();
//        ==============实例一  普通示例
        arr1.add(1);
        arr1.add(2);
        arr1.add(3);
        arr1.add(4);


        arr2.add(2);
        arr2.add(3);
        arr2.add(1);
        arr2.add(4);
//        ===================
//        ===================  实例二 考察对重复数字的处理
//        arr1.add(1);
//        arr1.add(1);
//        arr1.add(3);
//
//        arr2.add(2);
//        arr2.add(3);
//        arr2.add(5);
//        ===================  实例二

//       ===================  实例三 考察对0概率的处理
//        arr1.add(1);
//        arr1.add(2);
//        arr1.add(-1);
//
//        arr2.add(0);
//        arr2.add(1);
//        arr2.add(4);
//        ===================  实例三
        System.out.println("实例1");
        for (int i = 0; i < 10; i++) {
            Integer num = randdomPick(arr1, arr2);
            System.out.println("num = " + num);

        }
    }
}
